

#pragma once

#include "GeneralUserObject.h"
#include "Coupleable.h"
#include "ScalarCoupleable.h"
#include "MooseVariableDependencyInterface.h"
#include "MooseVariable.h"
#include "SubProblem.h"
#include "NonlinearSystem.h"
#include "Assembly.h"
#include "FEProblem.h"
#include "MooseMesh.h"

#include "libmesh/elem.h"
#include "libmesh/parallel_algebra.h"

#include "NonlinearSystem.h"

#include "ReconstructionSystem.h"

// Forward Declarations
class ReconstructionUserObject;

namespace libMesh
{
class Elem;
class QBase;
}

template <>
InputParameters validParams<ReconstructionUserObject>();


class ReconstructionUserObject : public GeneralUserObject
{
public:
  ReconstructionUserObject(const InputParameters & parameters);
  // ReconstructionUserObject(ReconstructionUserObject & x, Threads::split split);
  virtual ~ReconstructionUserObject();

  virtual void initialize();
  virtual void execute();
  virtual void finalize();
  std::shared_ptr<ReconstructionSystem> getReconstructionSystem() { return _rs_sys; }
protected:
  std::shared_ptr<ReconstructionSystem> _rs_sys;

};
